package org.s170.dao;
import org.s170.entity.UserInfo;
import org.s170.utils.Dbutil;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserInfoDao  {

    public Long queryUserByPageCount(UserInfo userInfo){
        Long count = 0L;

        // 第一：定义操作数据库的SQL语句，动态添加条件
        StringBuilder sql =new StringBuilder("select count(userID) from useInfo where 1=1");

        // 1.定义集合，用于存储SQL语句的参数值
        List<Object> params = new ArrayList<Object>();

        // 2.拼接SQL语句
        if(userInfo!=null && userInfo.getUsername()!=null && !"".equals(userInfo.getUsername().trim())) {
            sql.append(" and username like ?") ;
            params.add("%" + userInfo.getUsername() + "%") ;
        }


        //第二：获取连接对象
        Connection conn = Dbutil.getConnection();

        //第三：使用连接对象，获取语句对象(PreparedStatement)，并预编译SQL语句
        PreparedStatement pstmt = null ;
        ResultSet rst = null ;
        try {
            pstmt= conn.prepareStatement(sql.toString());

            //第四：设置数据
            //语法：语句对象.setXxx(问号占位符索引,数据) ;
            //遍历集合，填充参数值
            for(int i=0;i<params.size();i++) {
                pstmt.setObject(i+1,params.get(i));
            }

            //第五：执行SQL语句，并接收返回结果
            //语句对象.executeUpdate() -> 增,删,改	   ->  返回的是受影响的记录数
            //语句对象.executeQuery()  -> 查			-> 	返回的是结果集(ResultSet)
            rst = pstmt.executeQuery() ;
            //第六：对结果进行处理
            //遍历结构集各行各列的数据，封装到相关的实体对象或集合
            //判断有没有数据:结果集对象.next()
            //获取结果集的数据:
            //结果集对象.getXxx(查询数据的索引) ;
            //结果集对象.getXxx(查询数据的字段名称) ;

            if(rst.next()) {
                count = rst.getLong(1) ;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 第七：关闭对象
            Dbutil.closeAll(conn,pstmt,rst);
        }
        return count;
    }




    public List<UserInfo> queryUserByPage(UserInfo userInfo,Integer page,Integer limit) {

        List<UserInfo> list = new ArrayList<UserInfo>();

        // 第一：定义操作数据库的SQL语句，动态添加条件
        StringBuilder sql = new StringBuilder("select userID,username,pass,sex,email,headimg,registerTime,rownumber from ( ");
        sql.append("select userID,username,pass,sex,email,headimg,registerTime, row_number() over(order by u.userID asc) as rownumber from useInfo as u where 1=1");

        // 1.定义集合，用于存储SQL语句的参数值
        List<Object> params = new ArrayList<Object>();

        // 2.拼接SQL语句
        if (userInfo != null && userInfo.getUsername() != null && !"".equals(userInfo.getUsername())) {
            sql.append(" and username like ?");
            params.add("%" + userInfo.getUsername() + "%");
        }

        sql.append(") as t");

        // 分页条件：(当前页数-1) * 每页记录数+1 and 当前页数 * 每页记录数
        sql.append(" where rownumber between ? and ?");
        params.add((page - 1) * limit + 1);
        params.add(page * limit);

        //第二：获取连接对象
        Connection conn = Dbutil.getConnection();

        //第三：使用连接对象，获取语句对象(PreparedStatement)，并预编译SQL语句
        PreparedStatement pstmt = null;
        ResultSet rst = null;
        try {
            pstmt = conn.prepareStatement(sql.toString());

            //第四：设置数据
            //语法：语句对象.setXxx(问号占位符索引,数据) ;
            //遍历集合，填充参数值
            for (int i = 0; i < params.size(); i++) {
                pstmt.setObject(i + 1, params.get(i));
            }

            //第五：执行SQL语句，并接收返回结果
            //语句对象.executeUpdate() -> 增,删,改	   ->  返回的是受影响的记录数
            //语句对象.executeQuery()  -> 查			-> 	返回的是结果集(ResultSet)
            rst = pstmt.executeQuery();
            //第六：对结果进行处理
            //遍历结构集各行各列的数据，封装到相关的实体对象或集合
            //判断有没有数据:结果集对象.next()
            //获取结果集的数据:
            //结果集对象.getXxx(查询数据的索引) ;
            //结果集对象.getXxx(查询数据的字段名称) ;

            while (rst.next()) {
                // 1.读取数据
                UserInfo u=new UserInfo();
                u.setUserid(rst.getInt(1));
                u.setUsername(rst.getString(2));
                u.setPass(rst.getString(3));
                u.setSex(rst.getString(4));
                u.setEmail(rst.getString(5));
                u.setHeading(rst.getString(6));
                u.setRegisterTime(rst.getTimestamp(7));
                list.add(u);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 第七：关闭对象
            Dbutil.closeAll(conn, pstmt, rst);
        }
        return list;
    }

}
